//
// Resource.cpp
// Usage: Resource object define
// Create Date: 2009-03-05
// Author: MaJiuyue
//
#include "Resource.h"
#include "ResourceManager.h"

Resource::Resource(Callable * target)
	: m_target(target)
{
	m_iResourceID = -1;
}

Resource::~Resource()
{

}

bool Resource::RegisterInterface(CallInterface0 SCI, u32 SCIID)
{
	if( SCIT0.lookup(SCIID) != NULL )
		return false;
	
	SCIT0.add(SCIID, SCI);
	return true;
}

bool Resource::RegisterInterface(CallInterface1 SCI, u32 SCIID)
{
	if( SCIT1.lookup(SCIID) != NULL )
		return false;
	
	SCIT1.add(SCIID, SCI);
	return true;
}

bool Resource::RegisterInterface(CallInterface2 SCI, u32 SCIID)
{
	if( SCIT2.lookup(SCIID) != NULL )
		return false;
	
	SCIT2.add(SCIID, SCI);
	return true;
}

bool Resource::RegisterInterface(CallInterface3 SCI, u32 SCIID)
{
	if( SCIT3.lookup(SCIID) != NULL )
		return false;
	
	SCIT3.add(SCIID, SCI);
	return true;
}

bool Resource::RegisterInterface(CallInterface4 SCI, u32 SCIID)
{
	if( SCIT4.lookup(SCIID) != NULL )
		return false;
	
	SCIT4.add(SCIID, SCI);
	return true;
}

bool Resource::RegisterInterface(CallInterface5 SCI, u32 SCIID)
{
	if( SCIT5.lookup(SCIID) != NULL )
		return false;
	
	SCIT5.add(SCIID, SCI);
	return true;
}

void Resource::RemoveInterface(u32 SCIID)
{
	SCIT0.remove(SCIID);
	SCIT1.remove(SCIID);
	SCIT2.remove(SCIID);
	SCIT3.remove(SCIID);
	SCIT4.remove(SCIID);
	SCIT5.remove(SCIID);
}

u32 Resource::CallSCI(u32 SCIID, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5)
{
	CallInterface0 CI0 = SCIT0.lookup(SCIID);
	if (CI0)
		return (m_target->*CI0)();

	CallInterface1 CI1 = SCIT1.lookup(SCIID);
	if (CI1)
		return (m_target->*CI1)(p1);

	CallInterface2 CI2 = SCIT2.lookup(SCIID);
	if (CI2)
		return (m_target->*CI2)(p1, p2);

	CallInterface3 CI3 = SCIT3.lookup(SCIID);
	if (CI3)
		return (m_target->*CI3)(p1, p2, p3);

	CallInterface4 CI4 = SCIT4.lookup(SCIID);
	if (CI4)
		return (m_target->*CI4)(p1, p2, p3, p4);

	CallInterface5 CI5 = SCIT5.lookup(SCIID);
	if (CI5)
		return (m_target->*CI5)(p1, p2, p3, p4, p5);

	return -1;
}

